// DOM Constants
var ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = 8;
var DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = 12;

function Address()
{
    this.address1 = "";
    this.address2 = "";
    this.city = "";
    this.county = "";
    this.country = "";
    this.postcode = "";
}

Address.prototype.toString = function()
{
    return this.address1 + ", " + this.address2 + ", " + this.city + ", " + this.county + ", " + this.country + ", " + this.postcode;
}

Address.prototype.shortAddress = function()
{
    if (this.address2 != null && this.address2.length > 0)
        return this.address1 + ", " + this.address2 + ", " + this.city;
    else
        return this.address1 + ", " + this.city;;
}


var req = null;
var popup = null;
var selectBox = null;
var addresses = null;
var formName = null;
var postcodeRegex = /[a-z]{1,2}[0-9][0-9a-z]?[0-9][a-z]{2}/i;
var spacesRegex = / /g;

function getFormElement(fieldName)
{
    return document.getElementById(formName + fieldName);
}

function initPostcodeLookup(fn)
{
    formName = fn;
    selectBox = document.getElementById("select-box");
}

function load(url)
{
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
    }
    else if (window.ActiveXObject)
    {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req)
        {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}

function processReqChange()
{
    if (req.readyState == 4) // Complete
    {
        if (req.status == 200) // OK
        {
            var response  = req.responseXML.documentElement;
            addresses = deSerializeAddresses(response);
            populateSelectBox(addresses);
        }
        else
        {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }
}

function populateSelectBox(addresses)
{
    var html = "<option>Please select an address</option>";

    if (addresses == null || addresses.length < 1)
    {
        html = "<option>No addresses found</option>"
    }
    else
    {
        for (var i = 0; i < addresses.length; i++)
        {
            html += "<option value=\"" + i + "\">" + addresses[i].shortAddress() + "</option>";
        }
    }

    html = "<p><span class=\"fielddescription\"><select onchange=\"javascript:selectAddress()\" id=\"addresses\">" + html + "</select></span></p>";
    document.getElementById("look-up-button").value = "Autofill Address...";
    selectBox.innerHTML = html;
}

function selectAddress()
{
    var selectElement = document.getElementById("addresses");
    var index = selectElement.options[selectElement.selectedIndex].value;
    var fields = new Array("address1", "address2", "city", "county", "postcode");
    var address = addresses[index];

    for (var i = 0; i < fields.length; i++)
    {
        var formElem = getFormElement(fields[i]);
        if (formElem)
            formElem.value = address[fields[i]];
        else
            alert("formElem was null" + fields[i]);
    }
    document.getElementById("select-box").innerHTML = "";
    document.getElementById("site/Register.profile.telephone").focus();
}

function deSerializeAddresses(response)
{
     var addressNodes = response.getElementsByTagName('address');
     var addresses = new Array(addressNodes.length);

     for (var i = 0; i < addressNodes.length; i++)
     {
         var address = new Address();
         var addressNode = addressNodes.item(i);
         var node = addressNode.firstChild;

         while (node)
         {
             if (node.nodeType == ELEMENT_NODE && node.firstChild != null)
             {
                 address[node.nodeName] = node.firstChild.data;
             }
             node = node.nextSibling;
         }

         addresses[i] = address;
     }

     return addresses;
}

function lookupAddress()
{
    var postcode = document.getElementById("postcode-lookup").value;

    if (postcode != null)
    {
        //postcode = postcode.replace(spacesRegex, "");
        //if (postcode.match(postcodeRegex))
        //{
            var url = "/address-lookup/addresses.xml?postcode=" + postcode;
            load(url);
        //}
    }
}


